let isFlushPending = false;

const p = Promise.resolve()

export function nextTick(fn?) {
    // 执行nextTick后，就会执行flushJobs方法
    return fn ? p.then(fn) : p
}

// 定义一个队列
const queue:any[] = []
// 创建一个之前的队列（用于解决watchEffect）
const activePreFlushCbs:any[]  = []

export function queueJobs(job) {
    console.log('新的依赖',job);
    
    if(!queue.includes(job)) {
        queue.push(job)
    }
    console.log('队列',queue);
    
    // 微任务队列
    queueFlush()

}

export function queuePreFlushCb(job) {
    activePreFlushCbs.push(job)
    queueFlush()
}

function queueFlush() {
    if(isFlushPending) return
    isFlushPending = true
    // 此时再往后就是异步任务了，由于for循环的同步任务还没执行完，所以会跳出去
    nextTick(flushJobs)
}

function flushJobs() {
    isFlushPending = false

    flushPreFlushCbs()

    let job
    while((job = queue.shift())) {
        job && job()
    }
}


function flushPreFlushCbs() {
    for (let i = 0; i < activePreFlushCbs.length; i++) {
        activePreFlushCbs[i]()
    }
}
